<?php
/**
 * Zead
 *
 * LICENSE	
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://www.opensource.org/licenses/bsd-license.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to eu@marcelomx.com so we can send you a copy immediately.
 *
 * @category   Zead
 * @author     Marcelo Rodrigues Gonzaga <eu@marcelomx.com>
 * @copyright  Copyright (c) 2008 Marcelo Rodrigues Gonzaga
 * @link       http://code.google.com/p/zead 
 * @license    http://www.opensource.org/licenses/bsd-license.php     New BSD License
 *
 **/


/**
 * Class Zead_Html_ElementList
 * 
 * @category   Zead
 * @package    Zead_Html
 * @copyright  Copyright (c) 2008 Marcelo Rodrigues Gonzaga 
 * @license    http://www.opensource.org/licenses/bsd-license.php     New BSD License  
 */
class Zead_Html_ElementList extends ArrayIterator 
{
	/**
	 * Iterage com a lista aplicação uma função em cada elemento e retornando
	 * uma nova lista que contenha elementos que seja aprovados pela função
	 * aplicada a cada um.
	 * 
	 * @return Zead_Html_ElementList
	 */	
	public function select($iterator)
	{
		$list = new self();
		while ($this->valid()) {
			if ($iterator != '') {
				$result = call_user_func_array($iterator, array($this->current(), $this->key()));
				if ($result) $list->append($this->current());
			}
			$this->next();
		}
		$this->rewind();
		return $list;
	}

	/**
	 * Iterage com a lista aplicando uma função em cada elemento da lista
	 * @param  string $iterator A função ou objeto/método respectivamente
	 * @return self
	 */
	public function each($iterator) 
	{
		while ($this->valid()) {
			call_user_func_array((array) $iterator, array($this->current(), $this->key()));
			$this->next();
		}
		$this->rewind();	
		return $this;
	}

	/**
	 * Mapeia os elementos da lista e chama por um método em cada objeto que esteja em um
	 * um índice, aplicando os argumentos passados para o método invoke, respectivamente.
	 * @param  string $method O nome do método a ser chamado em cada objeto
	 * @param  mixed  $args   Os demais argumentos passados em uma ordem qualquer.
	 * @return self
	 */
	public function invoke() 
	{
		$args = func_get_args();
		$method = array_shift($args);

		while ($this->valid()) {
			$object = $this->current();
			if (is_object($object) && method_exists($object, $method)) {
				call_user_func_array(array($object,$method), (array) $args);
			}
			$this->next();
		}
		$this->rewind();
		return $this;
	}
}

